from channels.exceptions import StopConsumer
from channels.generic.websocket import WebsocketConsumer
# 异步改成同步
from asgiref.sync import async_to_sync
import datetime
import json
from chart_web import models


class ChatConsumer(WebsocketConsumer):
    def websocket_connect(self, message):
        """客户端请求建立链接时 自动触发"""
        # 进行握手(服务端允许与客服端进行链接)
        self.accept()  # 建立链接  并且自动帮你维护每一个客户端
        # 服务端主动向客服端发送信息 self--当前链接对象
        # self.send('当前用户为，链接成功')

        # 2.群聊功能
        # 将这个客户端对象加入到内存中 self.channel_name--当前链接对象的随机别名
        # 获取当前组名,路由匹配中的
        group = self.scope['url_route']['kwargs'].get('group')
        async_to_sync(self.channel_layer.group_add)(group, self.channel_name)  # 异步转同步

    def websocket_receive(self, message):
        """客户端发送数据过来  自动触发"""
        # 浏览器基于websocket向服务端发送数据，自动触发
        # message-----{'type': 'websocket.receive', 'text': '口袋VS'}
        # 通知当前组内所有的对象执行test的方法，在此方法中自己可以去定义任意的功能
        group = self.scope['url_route']['kwargs'].get('group')
        # 存数据库
        # message(正常发送信息) {'type': 'websocket.receive', 'text': '{"txt":"看到v吗","requestObj":"我不是大头"}'}
        # message(第一次获取信息) {'txt': '', 'requestObj': '我不是大头'}
        # print(json.loads(message['text']))
        # 查询当前对象

        # 1.正常发送信息 有 lzw: 'hpl'
        lzw = json.loads(message['text']).get('lzw')
        if lzw and lzw == 'hpl':
            username = json.loads(message['text'])['requestObj']
            content = json.loads(message['text'])['txt']
            user_obj = models.UserInfo.objects.filter(username=username).first()
            # 当前用户是否为合法用户
            if user_obj:
                # 创建聊天内容记录
                models.ChartRoom.objects.create(
                    name='你说我也说',
                    room_group=group,
                    content=content,
                    userinfo=user_obj,
                    channel_name=self.channel_name,
                )
                async_to_sync(self.channel_layer.group_send)(group, {'type': 'test.xx', 'message': message})
            else:
                # 非法用户，不能聊天
                self.close()
        else:
            # 获取历史信息(考虑第一次为空的情况下) 第一次创建该房间
            room_obj = models.ChartRoom.objects.filter(chart_type=2, room_group=group)
            # 有聊天室
            if room_obj:
                async_to_sync(self.channel_layer.group_send)(group,
                                                             {'type': 'historical.information', 'message': message})
            # else:
            #     # 第一次进来，没有聊天记录
            #     username = json.loads(message['text'])['requestObj']
            #     contents = json.loads(message['text'])['txt']
            #     user_obj = models.UserInfo.objects.filter(username=username).first()
            #     # 创建聊天房间记录
            #     models.ChartRoom.objects.create(
            #         name='你说我也说',
            #         room_group=group,
            #         content=contents,
            #         userinfo=user_obj,
            #         channel_name=self.channel_name,
            #     )

    def test_xx(self, event):
        '''正常发送信息'''
        # print(json.loads(event['message']))
        # json.loads(event['message']['text']) ---- {'txt': '里面v的', 'requestObj': '我不是大头'}
        content = json.loads(event['message']['text'])['txt']
        # 谁登录就是谁发的
        username = json.loads(event['message']['text'])['requestObj']
        dic = {'content': content, 'username': username}
        dic = json.dumps(dic)
        # 给组内每一个人都发
        self.send(dic)

    def historical_information(self, event):
        # 获取历史信息(考虑第一次为空的情况下)
        group = self.scope['url_route']['kwargs'].get('group')
        room_obj = models.ChartRoom.objects.filter(chart_type=2, room_group=group)
        for item in room_obj:
            # 当前聊天室内容
            content = item.content
            username = item.userinfo.username
            # 把内容返回给前端(无法赋值)
            dic = {'content': content, 'username': username}
            dic = json.dumps(dic)
            self.send(dic)

    def websocket_disconnect(self, message):
        """客户端断开链接之后  自动触发"""
        # 只要是主动执行了断开链接，就会触发
        group = self.scope['url_route']['kwargs'].get('group')
        # print('断开链接')
        async_to_sync(self.channel_layer.group_discard)(group, self.channel_name)

        raise StopConsumer()
